const fs = require('fs');
const userService = require('../service/user.service');
const fileService = require('../service/file.service');
const {AVATAR_PATH, COVER_PATH} = require('../constants/file-path');
const md5password = require('../utils/password-handle');

class UserController {

  // 创建用户
  async create(ctx, next) {
    // 1.获取用户的参数
    const user = ctx.request.body;
    // 2.检测/插入数据
    const result = await userService.create(user);
    // 3.返回数据
    ctx.body = result;
  }

  // 返回用户头像
  async avatarInfo(ctx, next) {
    // 1.获取参数
    const {userId} = ctx.params;
    // 2.查询数据
    const result = await fileService.getAvatarByUserId(userId);
    if (result) {
      // 3.返回头像
      ctx.response.set('content-type', result.mimetype);
      ctx.body = fs.createReadStream(`${AVATAR_PATH}/${result.filename}`);
    } else {
      ctx.body = {
        code: "404",
        message: "没有找到该用户的头像"
      }
    }
  }

  // 返回用户cover
  async coverInfo(ctx, next) {
    // 1.获取参数
    const {userId} = ctx.params;
    // 2.查询数据
    const result = await fileService.getCoverByUserId(userId);
    if (result) {
      // 3.返回cover
      ctx.response.set('content-type', result.mimetype);
      ctx.body = fs.createReadStream(`${COVER_PATH}/${result.filename}`);
    } else {
      ctx.body = {
        code: "404",
        message: "没有找到该用户的cover"
      }
    }
  }

  // 注销用户
  async remove(ctx, next) {
    // 1.获取参数
    const {id, nickname} = ctx.user;
    // 2.删除用户
    const result = await userService.remove(id);
    if (result.length > 0) console.log(`用户 ${nickname} 已注销`);
    // 3.返回结果
    ctx.body = result;
  }

  // 修改博客是否开放
  async update(ctx, next) {
    // 1.获取参数
    const {id} = ctx.user;
    const {isPrivate} = ctx.params;
    // 2.操作数据库
    const result = await userService.update(id, isPrivate);
    // 3.返回结果
    ctx.body = result;
  }

  // 修改博客是否开放
  async setPassword(ctx, next) {
    // 1.获取参数
    const {id} = ctx.user;
    const {password} = ctx.request.body;
    const realPassword = md5password(password);
    // 2.操作数据库
    const result = await userService.updatePassword(realPassword, id);
    // 3.返回结果
    ctx.body = result;
  }

  // 设置信条
  async setCreed(ctx, next) {
    // 1.获取参数
    const {creed} = ctx.request.body;
    const {id} = ctx.user;
    // 2.操作数据库
    const result = await userService.setCreed(id, creed);
    // 3.返回结果
    ctx.body = result;
  }

}

module.exports = new UserController();
